
package com.csscis.ssm.core.generic;

import java.util.List;

import com.csscis.ssm.core.feature.orm.mybatis.Page;

/**
 * 所有自定义Dao的顶级接口, 封装常用的增删查改操作, 可以通过Mybatis Generator Maven 插件自动生成Dao,
 * 也可以手动编码,然后继承GenericDao 即可.
 * <p/>
 * Model : 代表数据库中的表 映射的Java对象类型 PK :代表对象的主键类型
 *
 * @author QingHe
 * @since 2014年6月9日 下午6:14:06
 */
public interface GenericDao<Model, PK> {

    /**
     * 插入对象
     *
     * @param model 对象
     */
    int insertSelective(Model model);

    /**
     * 更新对象
     *
     * @param model 对象
     */
    int updateByPrimaryKeySelective(Model model);

    /**
     * 通过主键, 删除对象
     *
     * @param id 主键
     */
    int deleteByPrimaryKey(PK id);

    /**
     * 根据参数对象设置的值 删除对象
     * 用于满足不根据主键删除的其它条件
     * @param model 实体对象
     */
    int deleteObject(Model model);

    /**
     * 通过主键, 查询对象
     *
     * @param id 主键
     * @return   查找到的对象
     */
    Model selectByPrimaryKey(PK id);

    /**
     * 查询所有对象
     *
     * @param model 作为条件的实体对象
     * @return      查找到的所有对象列表
     */
    List<Model> selectAll(Model model);

    /**
     * 分页查询
     *
     * @param page    分页对象
     * @param example 表达式
     * @return        实体对象列表
     */
    List<Model> selectByExampleAndPage(Page<Model> page, GenericExample example);

    /**
     * 分页查询
     *
     * @param page  分页对象
     * @param model 实体对象
     * @return      实体对象列表
     */
    List<Model> selectAndPage(Page<Model> page, Model model);

}
